package com.mujin.keji.collectionsystem.http;

import com.alibaba.fastjson.JSONObject;
import com.mujin.keji.collectionsystem.base.BaseDto;
import com.mujin.keji.collectionsystem.base.BaseVo;
import com.mujin.keji.collectionsystem.dto.UploadFileDto;
import com.mujin.keji.collectionsystem.module.login.dto.LoginDto;
import com.mujin.keji.collectionsystem.module.login.vo.LoginCollectionVo;
import com.mujin.keji.collectionsystem.module.main.dto.BannerListDto;
import com.mujin.keji.collectionsystem.module.main.dto.QueryPhoneDto;
import com.mujin.keji.collectionsystem.module.main.dto.SavePhoneDto;
import com.mujin.keji.collectionsystem.module.main.vo.BannerVo;
import com.mujin.keji.collectionsystem.module.main.vo.SavePhoneVo;
import com.mujin.keji.collectionsystem.module.message.dto.MsgDto;
import com.mujin.keji.collectionsystem.module.message.vo.MsgVo;
import com.mujin.keji.collectionsystem.module.mypager.dto.CheckPwdDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.LateVersionDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.LogoutDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.UpdatePwdDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.UpdateUserDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.UserInfoDto;
import com.mujin.keji.collectionsystem.module.mypager.dto.VersionDto;
import com.mujin.keji.collectionsystem.module.mypager.vo.UpdateUserVo;
import com.mujin.keji.collectionsystem.module.mypager.vo.UserInfoVo;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.ApplyCaseDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.CallDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.CaseInfoDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.LabelsDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.MarkDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.QueryContactDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.QueryUserDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.StatusCountDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.VisitRecordDetailDto;
import com.mujin.keji.collectionsystem.module.outboundtask.dto.VisitRecordDto;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.ApplyCaseVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.CallVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.LabelVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.MarkVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.SaveVisitRecordVo;
import com.mujin.keji.collectionsystem.module.outboundtask.vo.StatusCountVo;
import com.mujin.keji.collectionsystem.module.protectionrules.dto.OutRuleDto;
import com.mujin.keji.collectionsystem.module.protectionrules.vo.OutRuleVo;
import com.mujin.keji.collectionsystem.module.sign.dto.SignDetailDto;
import com.mujin.keji.collectionsystem.module.sign.dto.SignDto;
import com.mujin.keji.collectionsystem.module.sign.vo.SignDetailVo;
import com.mujin.keji.collectionsystem.module.sign.vo.SignVo;
import com.mujin.keji.collectionsystem.module.tripplan.dto.PathPlanDto;
import com.mujin.keji.collectionsystem.module.tripplan.dto.QueryPlanDetailListDto;
import com.mujin.keji.collectionsystem.module.tripplan.dto.QueryPlanListDto;
import com.mujin.keji.collectionsystem.module.tripplan.vo.QueryPlanVo;
import com.mujin.keji.collectionsystem.module.updata.dto.UploadDto;

import java.util.List;
import java.util.Map;

import io.reactivex.Flowable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * api接口
 *
 * @author weishixiong
 * @Time 2018-04-2
 */

public interface ApiService {


    /**
     * 登录
     * post
     * 表单提交
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("login")
    Flowable<BaseDto<LoginDto>> login(@FieldMap Map<String, String> map);

    /**
     * 登出
     * post
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("logout")
    Flowable<BaseDto<LogoutDto>> logout(@FieldMap Map<String, String> map);

    /**
     * 获取广告bananer接口
     *
     * @param vo
     * @return
     */
    @POST("config/banner")
    Flowable<BaseDto<BannerListDto>> getAdvertises(@Body BannerVo vo);

    /**
     * 接口名称 案件信息
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("case/queryCaseInfo")
    Flowable<BaseDto<CaseInfoDto>> queryCaseInfo(@FieldMap Map<String, String> map);

    /**
     * 签到详情
     *
     * @param vo
     * @return
     */
    @POST("sign/getDate")
    Flowable<BaseDto<SignDetailDto>> signGetDate(@Body SignDetailVo vo);

    /**
     * 通知列表
     *
     * @param vo
     * @return
     */
    @POST("message/query")
    Flowable<BaseDto<MsgDto>> queryMessage(@Body MsgVo vo);


    /**
     * 一键上传文件
     *
     * @param multipartBody
     * @return
     */
    @POST("data/upload")
    Flowable<BaseDto<UploadDto>> uploadFileWithRequestBody(@Body MultipartBody multipartBody);

    /**
     * 修改密码
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("currentUser/changeUserPassword")
    Flowable<BaseDto<UpdatePwdDto>> changeUserPassword(@FieldMap Map<String, String> map);

    /**
     * 检查密码
     * post
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("currentUser/checkUserPassword")
    Flowable<BaseDto<CheckPwdDto>> checkPwd(@FieldMap Map<String, String> map);


    /**
     * 签到
     *
     * @param vo
     * @return
     */
    @POST("sign")
    Flowable<BaseDto<SignDto>> sign(@Body SignVo vo);

    /**
     * 修改用户信息
     * post
     *
     * @param vo
     * @return
     */
    @POST("currentUser/update")
    Flowable<BaseDto<UpdateUserDto>> update(@Body UpdateUserVo vo);

    /**
     * 接口名称 查询拜访任务列表
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("case/queryApplyCase")
    Flowable<BaseDto<ApplyCaseDto>> queryApplyCase(@Body ApplyCaseVo vo);


    /**
     * 接口名称 催收记录
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("case/queryMark")
    Flowable<BaseDto<MarkDto>> queryMark(@Body MarkVo vo);

    /**
     * 接口名称 外放任务统计
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("case/count")
    Flowable<BaseDto<List<StatusCountDto>>> count(@Body StatusCountVo vo);

    /**
     * 接口名称 查询行程规划列表
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("plan/queryPlan")
    Flowable<BaseDto<QueryPlanListDto>> queryPlan(@Body QueryPlanVo vo);

    /**
     * 接口名称 查询行程规划详情
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("plan/queryDetail")
    Flowable<BaseDto<QueryPlanDetailListDto>> queryDetail(@FieldMap Map<String, String> map);

    /**
     * 接口名称 重新规划 行程规划路线
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("plan/pathPlan")
    Flowable<BaseDto<PathPlanDto>> pathPlan(@FieldMap Map<String, String> map);

    /**
     * 上传单头像
     *
     * @param multipartBody
     * @return
     */
    @POST("currentUser/updateImg")
    Flowable<BaseDto<String>> updateImg(@Body MultipartBody multipartBody);

    /**
     * 接口名称 查询用户信息
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("currentUser/queryUserInfo")
    Flowable<BaseDto<UserInfoDto>> queryUserInfo(@Body UserInfoVo vo);

    /**
     * 接口名称 查询外访守则
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("rule/query")
    Flowable<BaseDto<OutRuleDto>> queryOutRule(@Body OutRuleVo vo);

    /**
     * 接口名称 催记标签
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("case/queryLabels")
    Flowable<BaseDto<LabelsDto>> queryLabels(@Body LabelVo vo);

    /**
     * 接口名称 外访详情
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("case/visitRecord")
    Flowable<BaseDto<VisitRecordDetailDto>> visitRecord(@FieldMap Map<String, String> map);

    /**
     * 接口名称 一键报警
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("call")
    Flowable<BaseDto<CallDto>> call(@Body CallVo vo);

    /**
     * 接口名称 保存外访记录
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("case/saveVisitRecord")
    Flowable<BaseDto<VisitRecordDto>> saveVisitRecord(@Body SaveVisitRecordVo vo);

    /**
     * 接口名称 搜索协助专员
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("currentUser/queryUser")
    Flowable<BaseDto<QueryUserDto>> queryUser(@FieldMap Map<String, String> map);

    /**
     * 接口名称 保存手机号码
     * 请求类型 post json
     *
     * @param vo
     * @return
     */
    @POST("device/save")
    Flowable<BaseDto<SavePhoneDto>> savePhone(@Body SavePhoneVo vo);

    /**
     * 接口名称 查询手机号码
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("device/query")
    Flowable<BaseDto<QueryPhoneDto>> queryPhone(@FieldMap Map<String, String> map);

    /**
     * 接口名称 案件联系人
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("case/queryContact")
    Flowable<BaseDto<QueryContactDto>> queryContact(@FieldMap Map<String, String> map);

    /**
     * 接口名称 获取短信验证码
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("sms/sendSms")
    Flowable<BaseDto<String>> sendSms(@FieldMap Map<String, String> map);

    /**
     * 接口名称 判断是否开始外访
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("case/beginVisit")
    Flowable<BaseDto<String>> beginVisit(@FieldMap Map<String, String> map);

    /**
     * 接口名称 获取历史版本
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("config/version")
    Flowable<BaseDto<VersionDto>> version(@FieldMap Map<String, String> map);

    /**
     * 接口名称 获取最新版本内容
     * 请求类型 post form
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("config/version/lasted")
    Flowable<BaseDto<LateVersionDto>> lasted(@FieldMap Map<String, String> map);


    @Streaming
    @GET
    Flowable<ResponseBody> download(@Url String url);

    /**
     * 获取session
     * @param vo
     * @return
     */
    @POST("login")
    Flowable<String> getLoginSession(@Body LoginCollectionVo vo);


    /**
     * 上传文件
     *
     * @param vo
     * @return
     */
    @POST("route/rest")
    Flowable<UploadFileDto> uploadSingle(@Body BaseVo vo);



    /**
     * 更新案件状态
     *
     * @param vo
     * @return
     */
    @POST("route/rest")
    Flowable<JSONObject> updateApplyStatus(@Body BaseVo vo);




}


